package com.ywk.base.javaBase.javaKeywords;

/**
 * @Author zbh
 * @Date 2023/2/2
 * Volatile关键字作用：
 * 1.保证变量的线程可见性（不能保证原子性，即线程安全）
 * 2.禁止指令重排（例如：单例的时候使用）:new一个对象由三个指令去操作（实际四个），先申请内存 —>赋值默认值，如：int类型的默认值为0）—>
 * 初始化值（真正要赋予的值），让这个对象的变量指向指向该值。
 * （所以如果发生指令重排序，则对象的变量拿到的值可能是第一步的值，即对象半初始化的时候属性就已经赋值了，然后另一个线程拿到的是变量初始化的值）
 */
public class VolatileTest {

    /**
     * 每个线程会有自己的内存副本，彼此隔离，而volatile的使用就是保证线程之间指定的
     * 变量变成可见的
     */
    public static volatile boolean flag = true;

    public static void main(String[] args) {
        new Thread(()->{
            while (flag){

            }
            System.out.println("=========Thread end========");
        }).start();
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("==========main end=========");
        flag=false;
    }
}
